Python笔记-备忘
一、向列表添加元素
x.append(y) #末尾添加一个元素
x.extend([y,z]) #末尾添加多个元素
x.insert(index,y)
二、向列表获取元素
x[index]
三、从列表删除元素
x.remove("y")
del x(index) # 删除整个列表 del x
x.pop() # 弹出列表最后一个元素 x.pop(index) 弹出index对应元素
四、列表分片 (创建副本)
x[x:y] #x为开始位置 ,y为结束位置 结束位置不包含
x[x:y:z] #z为步长 默认为1 z为-1,反转数列
五、列表
x.count(y) #计算x中出现多少次y
x.index(y) #返回y在x中的位置
x.reverse() #列表反转
x.sort()#从小到大排序 sort(fun,key=None,reverse=False)
六、元组(1,)
x = (a,b,c,d,e,f,g,...)
访问元组: x[index]
分片复制元组 x2=x1[:]
间接删除第3个元素 x=x[:2]+x[3:]
删除元组 del x
七、fotmat格式化(012format参数为位置参数,abc为标签,format中将等值的参数替换进去,即为关键字参数,位置参数必须在关键字参数前)
"{0} love {1}.{2}".format("I","baidu","com")#即' I love baidu.com'
"{a} love {b}.{c}".format(a="I",b="baidu",c="com")#即 'I love baidu.com'
"{0}:{1:.2f}".format("圆周率",3.14159) #即为'圆周率:3.14' 位置参数1后加了:替换域中,冒号表示格式化的开始,.2表示四舍五入保留2位小数
八、导入计时
import datetime
start = datetime.datetime.now()
...
...
delta = (datetime.datetime.now - start).total_seconds( )
print(delta)
九、数字处理
import math
math.floor() #地板 向下取整 int
math.ceil() #天花板 向上取整 4.5 =5
math.trunc()# 向0的方向取
round()#元整 四舍六入 5 取最近的偶数
math.sqrt()#开方
pow(x,y) == x**y
bin()#二进制
oct()#八进制
hex()#十六进制
math.pi# π
math.e
十、类型判断
type() #返回type型
isinstance(int,str)# is int 是 str的实例??
十一、列表 [list]
可以是任意对象(数字,字符串。对象,列表)
若干个元素 有序排列、可变
【】
查询、a[index]
时间复杂度 O(x) 遍历 x个元素
赋值:list[x] = value
删除:a.clear() #清除,剩下空列表
a.remove(value)# 移除一个值
a.pop([index]) #默认弹出最后一个值
其他操作:
a.reverse()->None# 就地更改 反转序列
a.sort(key=None,reverse=False)->None# 就地排序 默认升序 key 一个函数 指定key如何排序
列表复制:
== 比较值 (内容) ; is 比较内存地址
lst1 = lst0 没有赋值过程
A = [1,2,3]
B = A[:]
copy->list (shadow copy) x.copy() 依次重新创建
影子拷贝 及 浅拷贝 只是复制一个引用
深拷贝 deepcopy -> import copy
enumerate(iteralbe) #生成由二元组(元素数量为二的元组)构成的迭代对象
每个二元组由可迭代对象的索引及对应元素组成
普通的 for 循环
>>>i = 0
>>> seq = ['one', 'two', 'three']
>>> for element in seq:
... print i, seq[i]
... i +=1
...
0 one
1 two
2 three
for 循环使用 enumerate
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
十二、随机数
import random
random.randint(a,b) #返回【ab】间的整数
random.choice(seq) #从非空列表中随机挑选一个数
random.randrange([start,] stop) [,step] ) #按指定基数递增的集合中获取一个随机数, 基数缺省值为1
random.shuffle(list)# 就地打乱列表元素
十三、元组(tuple) 不可变对象
tuple() -> empty tuple
t = (1,)
访问元组 通过index
查询 index(value,[start,[stop]])
count(value)计数
命名元组 namedtuple(typename,field_name,verbose=False,rename=False)
命名元组,返回一个元组的子类,并定义了字段
field_name 可以是空格或逗号分割的字段的字符串,可以是字段的列表
导入 from collections import namedtuple
例: Point = namedtuple('P[名字]','x,y')
p1 = Point(4,5)
删除:del tuple
十四、字典 {dict}
创建: {}
{keys:value}
dict(key=value)
dict([(key,value),(key,value),])
dict1 = dict((('F',70),('A,80'),('S',90))) // dict(F=70,A=90,S=90)
doct1 => {'F':70,'A':80,'S':90}
fromkeys() #创建并返回一个新的字典 : 两个参数 第一个为key [第二个为value]
dict1 = {}
keys =['name','age','job']
employ = dict.fromkeys(keys)
employ =>{'name0':None,'age':None,'job':None }
dict1.fromkeys((1,2,3)) => {1:None,2:None,3:None}
dict2.fromkeys((1,2,3),"Number") = > {1:"Numbwe",2:"Number",3:"Number"}
访问字典:keys()返回键,values()返回字典所有的值,items()返回所有的项
dict1 = {}
dict1 = dict1.fromkeys(range(3),'你好')
dict1.keys() => dict_keys([0,1,2])
dict1.values() => dict_values(['你好','你好','你好'])
dict1.items() => dict_items([(0,'你好'),(1,'你好'),(2,'你好')])
get() #当键不存在 。返回None
dict1.get(31) =>'你好' dict.get(32) =>
若找不到,可在第二个参数设置values
判断是否存在 : index in dict1
setdefault() #当键不存在,自动添加None
更新字典:
data[key] = value
pets = {'米奇','老鼠','汤姆','波比'}
pets.update(米奇='酷奇')
pets => {'酷奇','老鼠','汤姆','波比'}
清空字典 :
dict.clear()
复制:
dict2 = dict1.copy() id 1 != 2
合并:
data1.update(data2)
pop() popitem()
dict1.pop(2) #弹出对应的键值
dict2.popitem() #弹出一个简直想
删除值:
del data[key]
函数赋为值:行为方法
def say_hello():
print('welcome')
person = {'name':'Jerry','hello':say_hello}
person['hello']() -> welcome
十五、字符串 不可变对象 有序 可迭代
'[]'.join(str)
处理: ~ split 系列(切割) 将字符串o按分割符切成若干字符串 并返回列表
~ s.partition(sep) -> (head,sep,tail)系列 将字符串按分隔符割成2段,返回2段和分隔符的元组
从左至右,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分
如果没有找到分隔符,就返回头、2个空元素的三元组
sep分割字符串。必须指定
s.rpartition(sep) -> (head,sep,tail)
从右至左,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分
如果没有找到分隔符,就返2个空元素和尾的三元组
split(sep=None,maxsplit=-1) ->list of strings
从左至右 sep 指定分割字符串。缺省的情况下空白字符串作为分隔符
masxsplit 指定分割的次数,-1表示遍历整个字符串
分割* splitliness([keepends]) -> list of strings
按照行来切字符串 keepends 指是否保留行分隔符(\n \t \r)
字符串大小写
s.upper()# 全大写
s.lower() #全小写
大小写,做判断的时候用 swapcase() 交互大小写
字符串排版
title() -> str 标题的每个单词都大写
s.capitalize() -> str 首个单词大写
s.center(width[,fillchar]) -> str width 打印宽度 fillchar 填充的字符
s.zfill(width) -> str width 打印宽度,居右,左边用 0 补充
s.ljust(width[,fillchar]) -> str 左对齐
s.rjust(width[,fillchar]) -> str 右对齐
字符串修改
s.replace(old,new[,count]) -> str 字符串找到匹配替换为新字串,返回新字符串 count 表示替代几次,默认全部替换
s.strip([chars]) ->str 从字符串两端去除指定的字符集chars中的所有字符 默认为去除空白
s.lstrip([chars]) ->从左开始
s.rstrip([chars]) ->从右开始
字符串查找 *
s.find(sub[,start,end]]) ->int 从左至右 查找sub(子串) 有返回索引 无,返回-1
s.rfind(sub[,start,end]]) ->int 从右至左 查找sub(子串) 有返回索引 无,返回-1
s.index(sub[,start[,end]]) -> int 从左至右 查找sub(子串) 有返回索引 无,抛异常
s.rindex(sub[,start[,end]]) -> int 从右至左 查找sub(子串) 有返回索引 无,抛异常
时间复杂度 O(n)
s.count(sub[,start[,end]]) ->int 在指定区间【)从左至右 统计sub出现的次数
字符串判断 *
endswith(suffix[,start[,end]]) -> bool 在指定区间,字符串是否suffix结尾
startwith(prefix[,start[,end]]) -> bool 在指定区间,字符串是否prefix开头
字符串判断 is 系列
isalnum() ->bool 是否是字母和数字组合
isalpha() ->bool 是否是字母
isdecimal() 是否只包含十进制数字
isdigit() 是否全部数字(0~9)
isidentifier() 是不是字母和下划线开头,其他都是字母、数字、下划线
islower() 是否都是小写
isupper() 是否全部大写
isspace() 是否只包含空白字符
字符串格式化 ***
+ 拼接字符串 非字符串先进行转化
join 拼接 只能使用分隔符 且被拼接的为可迭代对象
格式要求: 占位符 format % (values)(只能是一个对象,或数目相等的元组)
*** format
"{} {xxx}".format(*args,**kwargs) ->str args 位置参数,一个元组 kwargs 关键字参数,一个字典
花括号即占位符 {} 按位置匹配 {n} 表示位置参数索引为n的值
{{}} 打印{}
访问元素
"{0[0]}.{0[1]}".format(('magedu','com')) magedu','com==0 'magedu'=0[0]
对象属性访问
from collections import namedtuple
Point = namedtuple('Point','x,y')
p = Point(4,5)
"{{{0.x}.{0.y}}}".format(p)
对齐
'{:^30}'.format('centered') 居中
'{:*^30}'.format('centered') 居中 并用*填充
进制
"int:{0:d}; hex:{0:x}; oct:{0:o}; bin:{0:b}".format(42)
输出为: 'int:42; hex:2a; oct:52;bin:101010'
"int:{0:d}; hex:{0:#x}; oct:{0:#o}; bin:{0:#b}".format(42)
输出为: 'int:42; hex:Ox2a; oct:Oo52;bin:Ob101010'
十六、集合{set} 无序 {}内无映射关系
num = {1,2,3,4,5,5,6,5,4,3,1,1}
num = {1,2,3,4,5,6}
创建集合 :
set1 = {xxxxxxxx}
set2.set([xxxxxxxxxx])
访问集合:
for each in set1:
print(each,end='')
操作:
set1.add(num) 增加num
set1.remove(num) 删除num
不可变集合:
set1.frozenset({1,2,3,4})
删除 del set1
十七、函数、参数即参数结构
分类:内建函数、库函数、
可变参数: 一个形参可以匹配任意个参数
可变位置参数:收集形成一个tuple
def add(*nums): nums这个形参可以接受任意个实参
sum = 0
for x in nums:
sum += x
return sum
add(1,3,5) add(2,4,6) 收集多个实参为tuple
可变关键字参数:形参前用**符号,表示可接受多个关键字参数,收集的实参名和值组成dict
def showconfig(**kwargs):
for k,v in kwargs.items():
print('{} = {}'.format(k,v))
keywordonly-only 参数
def fun(*args,x,y,**kwargs);
print(x)
print(y)
print(args)
print(kwargs)
定义合法
fun(7,9,y=5,x=3,a=1,b='python')
=> 3
5
(7,9)
{'b':'python','a':1}
def fun(*args,x):
print(x)
print(args)
fun(3,5) =>error
fun(3,5,7) =>error
fun(3,5,x=7) => x=7, 3,5=args
def fn(*,x,y):
print(x,y)
fn(x=5,y=6) x y 必须keyword-only参数
可变参数和参数默认值:
def fn(*args,x=5):
print(x)
print(args)
fn() == fn(x=5) () 5
fn(5) == (5,) 5
fn(x=6) == () 6
def fn(y,*args,x=5):
print('x={},y={}.format(x,y)')
print(args)
n(5)、fn(1,2,3,x=10)、
def fn(x=5,**kwargs):
print('x={}'.format(x))
print(kwargs)
fn() => x = 5 {}
fn(6)=> x = 6 {}
fn(x=7,y=6) => x= 7 {'y':6}
函数参数:
参数规则一般顺序:普通参数、缺省参数、可变位置参数、keyword-only参数、可变关键字参数
def fn(x,y,z=3,*args,m=4,n,**kwargs):
print(x,y,z,m,n)
print(args)
print(kwargs)
fn(1,2,n=3) => 1,2,3,4,3 () {}
fn(1,2,10,11,t=7,n=5) =>1 2 10 4 5 (11,) {'t':7}
参数解构:
def add(x,y:)
return x+y
add(4,5)
t=(4,5)
add(t[0],t[1])
add(*t) 解构: 非字典型 * 字典型 **
d = {'x':5,'y':6}
add(**d)
内嵌函数和闭包:
函数内部可以访问到全局变量 不要去改变
count = 5
def myFun():
global count
count = 10
print(count)
nuFun() => 10
count => 10
闭包:
def funX(x):
def funY(y):
return x+y
return funY
i = funX(8)
i(5) => 13 // funX(8)(5)
nonlocal :在内部函数中可以移动外部函数中局部变量的值
def funX():
x = 5
def funY():
nonlocal x
x *= x
return x
return funY
funX()() => 25
lambda 创建匿名函数 :
g = lambda x : 2 * x + 1
g (5) => 11
filter()、map()
filter有两个参数,第一个参数可以是函数或者None, 如果是函数,则将第二个可迭代数据里的每一个元素作为函数参数进行计算,将返回为True的值
如果是None,则直接将第二个参数中为True的值筛选出来
例:奇数过滤器
def odd(x):
return x % 2
temp = filter(odd,range(10)) // list(filter(lambda x : x % 2 ,range(10)))
list(temp) => [1,3,5,7,9]
map() 映射 两个参数,一个函数加一个可迭代序列,将系列里的每一个元素作为函数的参数进行运算加工,知道可迭代序列每个元素都加工完毕,返回新序列
list(map(lambda x: x * 2,range(10)) => [,2,4,6,8,10,12,14,16,18,20]
十八、高阶函数 (函数作为返回值,一个或多个函数作为参数,往往形成闭包)
y=f(g(x))
def counter(base):
def inc(step=1):
nonlocal base
base += step
return base
return inc
柯里化:原来接受两个参数的函数变成接受一个参数的函数的过程,新的函数返回一个以原有第二个参数的函数
z=f(x,y) => z=f(x)(y)
例子: def add(x,y):
return x + y
print(add(4,5))
=> def new_add(x):
def inner(y):
return x + y
return inner
装饰器 *:本质是高阶函数,
十九、文件读写
声明:open('路径','模式',encoding='编码')
路径: 'c:\\path\\data.txe'
r'c:\path\data.txt'
模式:文本:'r'读 'w'写 'rw' 读写 'a' 打开,追加
二进制:'*b'
f = open(r'E:\pythonfile\date.txt','r')
f.read() #读取所有信息 指针移动至末尾
f.seek(0)# 指针移动开头 ,可重新读取
f.tell() #告诉指针位置
f.close() #关闭文件对象
读写:
f.read(n) #读取n位字符的信息
f.readlines() #读取所有行信息
f.readline() #读取下一行
for line in f.readlines():// for line in f:
print(line)
查询当前操作目录 import os
os.getcwd()
os.chdir(r'xxxxxx') 切换目录
文件写入:
f = open('路径','模式',encoding='编码')
f.write('xxxxxxxxx')
f.close()
f.writelines()# 一次写入多行
f.flush() #直接将内存缓存操作显示在文件上
自动释放资源
with open('路径','r',encoding='编码') as f:
for line in f:
print(line)
pickle模块:
import pickle
my_list = [123,123.4,'你好',[another list]]
pickle_file = open(r'E:\pythonfile\my_list.pkl','wb') 二进制写入
pickle.dump(my_list,my_list.file) dump方法保存数据
pickle_file.close()
打开:
import pickle
pickle_file = open(r'E:\pythonfile\my_list.pkl','rb')二进制读
my_list = pickle.load(pickle_file) load 加载数据
print(my_list)